package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.web.WebException;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.primefaces.model.DualListModel;

import simulaco.business.CargoBusiness;
import simulaco.business.ConcursoBusiness;
import simulaco.business.ConcursoNivelBusiness;
import simulaco.business.InstituicaoBusiness;
import simulaco.business.MateriaBusiness;
import simulaco.business.OrgaoBusiness;
import simulaco.business.SituacaoBusiness;
import simulaco.dto.Acao;
import simulaco.dto.Cargo;
import simulaco.dto.Concurso;
import simulaco.dto.ConcursoNivel;
import simulaco.dto.Instituicao;
import simulaco.dto.Materia;
import simulaco.dto.Orgao;
import simulaco.dto.Situacao;
import simulaco.dto.UsuarioPerfil;

@ManagedBean(name = "adminConcursoAction")
@SessionScoped
public class AdminConcursoAction extends WebAction {

    private static final long serialVersionUID = 4154584840590283341L;

    private Concurso concurso;

    private List<Concurso> concursos;
    private DualListModel<Materia> materiasDualList;

    public AdminConcursoAction() {

        super();
    }

    public String listar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            setConcursos(ConcursoBusiness.findAll());
            pageReturn = "adminListaConcursos";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararInclusao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        setAcaoIncluir(true);
        this.concurso = null;
        this.materiasDualList = null;
        getConcurso().setSituacao(Situacao.HABILITADO);
        return "adminMantemConcursoFromLista";
    }

    public String incluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            // ATUALIZAR LISTA MATERIAS
            getConcurso().getListaMateria().addAll(getMateriasDualList().getTarget());
            // INCLUI DADOS DO CONCURSO
            ConcursoBusiness.insert(this.concurso);
            //
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmInstituicao", be);
            pageReturn = "adminMantemConcurso";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public void executarAcao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        if (getAcao().equals(Acao.ATIVAR) || getAcao().equals(Acao.DESATIVAR)) {
            alterarSituacao();
        } else if (getAcao().equals(Acao.EXCLUIR)) {
            excluir();
        }
    }

    private void alterarSituacao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            if (getAcao().equals(Acao.ATIVAR)) {
                getConcurso().setSituacao(Situacao.HABILITADO);
            } else if (getAcao().equals(Acao.DESATIVAR)) {
                getConcurso().setSituacao(Situacao.DESABILITADO);
            }
            ConcursoBusiness.updateStatus(getConcurso());
            // ATUALIZA LISTA
            setConcursos(ConcursoBusiness.findAll());
            // GRAVA MENSAGEM PARA O USUARIO
            String msgAcao = (getAcao().equals(Acao.ATIVAR) ? "habilitado" : "desabilitado");
            addMessage("frmListaConcursos", "Concurso " + msgAcao + " com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaConcursos", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    private void excluir() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        try {
            ConcursoBusiness.delete(getConcurso());
            // ATUALIZA LISTA
            setConcursos(ConcursoBusiness.findAll());
            // GRAVA MENSAGEM PARA O USUARIO
            addMessage("frmListaConcursos", "Concurso excluido com sucesso!");
        } catch (BusinessException be) {
            addBusinessException("frmListaConcursos", be);
        } catch (TransactionException te) {
            throw new WebException(te);
        }
    }

    public String prepararAlteracao() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        setAcaoAlterar(true);
        this.materiasDualList = null;
        String pageReturn = "";
        try {
            this.concurso = ConcursoBusiness.findByPK(getConcurso().getCodigo());
            if (this.concurso == null) {
                throw new WebException("Concurso não encontrado.");
            }
            pageReturn = "adminMantemConcursoFromLista";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String alterar() throws WebException {

        verificarLogin(UsuarioPerfil.ADMINISTRADOR);
        String pageReturn = "";
        try {
            // ALTERA DADOS DO CONCURSO
            ConcursoBusiness.update(getConcurso());
            //
            pageReturn = listar();
        } catch (BusinessException be) {
            addBusinessException("frmConcurso", be);
            pageReturn = "adminAlteraConcurso";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public List<SelectItem> getInstituicaoItems() throws WebException {

        List<SelectItem> instituicaoItems = new ArrayList<SelectItem>();
        List<Instituicao> listaInstituicao;
        try {
            listaInstituicao = InstituicaoBusiness.findActives();
            for (Instituicao instituicao : listaInstituicao) {
                instituicaoItems.add(new SelectItem(new Integer(instituicao.getCodigo()), instituicao.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return instituicaoItems;
    }

    public List<SelectItem> getOrgaoItems() throws WebException {

        List<SelectItem> orgaoItems = new ArrayList<SelectItem>();
        List<Orgao> listaOrgao;
        try {
            listaOrgao = OrgaoBusiness.findActives();
            for (Orgao orgao : listaOrgao) {
                orgaoItems.add(new SelectItem(new Integer(orgao.getCodigo()), orgao.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return orgaoItems;
    }

    public List<SelectItem> getNivelItems() throws WebException {

        List<SelectItem> nivelItems = new ArrayList<SelectItem>();
        List<ConcursoNivel> listaNivel = ConcursoNivelBusiness.findAll();
        for (ConcursoNivel nivel : listaNivel) {
            nivelItems.add(new SelectItem(new Integer(nivel.getCodigo()), nivel.getNome()));
        }
        return nivelItems;
    }

    public List<SelectItem> getCargoItems() throws WebException {

        List<SelectItem> cargoItems = new ArrayList<SelectItem>();
        List<Cargo> listaCargo;
        try {
            listaCargo = CargoBusiness.findActives();
            for (Cargo cargo : listaCargo) {
                cargoItems.add(new SelectItem(new Integer(cargo.getCodigo()), cargo.getNome()));
            }
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return cargoItems;
    }

    public List<SelectItem> getSituacaoItems() throws WebException {

        List<SelectItem> situacaoItems = new ArrayList<SelectItem>();
        List<Situacao> listaSituacao = SituacaoBusiness.findAll();
        for (Situacao situacao : listaSituacao) {
            situacaoItems.add(new SelectItem(new Integer(situacao.getCodigo()), situacao.getNome()));
        }
        return situacaoItems;
    }

    public DualListModel<Materia> getMateriasDualList() throws WebException {

        if (this.materiasDualList == null) {
            //
            // List<Materia> listaConcursoMaterias =
            // getConcurso().getListaMateria();
            List<Materia> listaConcursoMaterias = new ArrayList<Materia>();
            //
            List<Materia> listaTodasMaterias = null;
            try {
                listaTodasMaterias = MateriaBusiness.findActives();
            } catch (TransactionException te) {
                throw new WebException(te);
            }
            //
            // listaTodasMaterias.removeAll(listaConcursoMaterias);
            //
            this.materiasDualList = new DualListModel<Materia>(listaTodasMaterias, listaConcursoMaterias);
        }
        //
        return this.materiasDualList;
    }

    public void setMateriasDualList(DualListModel<Materia> materiasDualList) {
        this.materiasDualList = materiasDualList;
    }

    public Concurso getConcurso() {
        if (this.concurso == null) {
            this.concurso = new Concurso();
        }
        return concurso;
    }

    public void setConcurso(Concurso concurso) {
        this.concurso = concurso;
    }

    public List<Concurso> getConcursos() {
        return concursos;
    }

    public void setConcursos(List<Concurso> concursos) {
        this.concursos = concursos;
    }

}
